/**********************************************************************************************************
** 驱动文件：	ptkt-ACS01.c
** 驱动类型：	ptkt
** 设备名称：	空调监测
** 设备型号：	ACS01
** 设备品牌：	融智云
** 设备协议：	Modbus-EX
** 驱动描述：	用于空调开关机状态监测
** 生成日期：	2019-04-10 12:11:36
**********************************************************************************************************/
#include "Includes.h"


/**********************************************************************************************************
* 定义设备数据点变量结构
**********************************************************************************************************/
typedef struct{
	Var RunStatus;							//运行状态
	Var Signal;									//运行信号值
	Var SignalThreshold;						//运行信号阀值
}Data_Struct;									//定义变量结构


/**********************************************************************************************************
* 设备数据点变量属性声明
**********************************************************************************************************/
const static Var_Property_Def var_attr[] = {
	{
		OCTSTR,
		0,
		READONLY,
		"RunStatus",
		"运行状态",
		"",
		"空调当前状态：0-空调停机，1-空调工作",
		0,
		0,
		"空调停机",
		"",
		0,
		0
	},
	{
		INTEGER,
		0,
		READONLY,
		"Signal",
		"运行信号值",
		"",
		"运行信号值",
		0,
		0,
		"空调工作",
		"空调停机",
		9999,
		0.05
	},
	{
		INTEGER,
		0,
		READWRITE,
		"SignalThreshold",
		"运行信号阀值",
		"",
		"空调运行信号阀值，用于判断空调工作和停机",
		0,
		0,
		"",
		"",
		3000,
		0
	}
};


/**********************************************************************************************************
* 函数名称： static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
* 函数说明： 生成获取传感器数据指令
* 输入参数： 指令索引，传感器地址，变量结构体指针,以及指令缓存区指针,指令长度
* 返回参数： 无
**********************************************************************************************************/
static void cmd_fun(short index, int addr, void *data, char *cmd, short *len)
{
	switch(index)
	{
		//获取红外控制器状态
		case 0:
			cmd[0] = 0xA5;
			cmd[1] = 0x02;
			cmd[2] = (addr>>8)&0x00FF;			
			cmd[3] = addr&0x00FF;
			cmd[4] = 0x04;
			cmd[5] = 0x00;								
			cmd[6] = 0x00;
			cmd[7] = 0x00;	
			cmd[8] = 0x12;
			*len = CRC16_Padding(cmd, 9);
			break;
		default:
			break;
	}
}


/**********************************************************************************************************
* 函数名称： static int parse_fun(short index, int addr, void *data, char *buf, short len)
* 函数说明： 解析传感器响应的数据，并写入数据库
* 输入参数： 解析索引,传感器地址，变量结构体指针，以及响应数据缓存取指针，响应数据长度
* 返回参数： 返回解析结果，返回0成功，返回1失败
**********************************************************************************************************/
static int parse_fun(short index, int addr, void *data, char *buf, short len)
{
	union{
		short 			dat16;
      	unsigned char  	dat8[2];
    }DAT16_8;						   //数据类型转换
	Data_Struct 	*d = (Data_Struct*)data;
	unsigned char	*buffer = (unsigned char*)buf;
	if(buf!=NULL && len>=8 && buffer[0]==0xA5 && buffer[1]==0x02 && addr==((buffer[2]<<8) + buffer[3]))
	{	
		if(CRC16_Check(buf,len))
		{	
			switch(index){
				case 0:
					DAT16_8.dat8[1] = buffer[12];
					DAT16_8.dat8[0] = buffer[13];
					d->Signal.value.inum = DAT16_8.dat16;
					
					SetStringDataPoint(&d->RunStatus, d->Signal.value.inum>d->SignalThreshold.value.inum, Normal, Alarm, "开机", "停机");

					break;
				default:
					break;
			}
			return 0;		
		}
	}
	return 1;
}


/**********************************************************************************************************
* 函数名称： void ptkt_ACS01_Registration(void)
* 函数说明： 普通空调监控驱动注册
* 输入参数： 无
* 返回参数： 无
**********************************************************************************************************/
void ptkt_ACS01_Registration(void)
{
	DeviceDriverRegistration(
		"ptkt",													//设备类型
		"空调监测",												//设备名称（导航栏默认显示名称）
		"融智云",												//设备品牌
		"ACS01",												//设备型号
		"用于空调开关机状态监测",								//驱动描述
		var_attr,												//变量属性声明
		sizeof(Data_Struct),									//变量结构体空间大小
		cmd_fun,												//发送指令生成函数
		parse_fun,												//数据解析函数
		200														//设备响应超时时间
	);
}


